home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2007 September / PCWSEP07.iso / Software / Resources / Internet / Maxthon 1.5.7 build 82 / mcombo.exe / Template / StartPage / js / app.js < prev    next >
Text File  |  2006-09-27  |  33KB  |  1,216 lines

  1. //**********************************************************
  2. // Global Functions
  3. //**********************************************************
  4.  
  5. //----------------------------------------------------------
  6. // Cookies Manager
  7. //----------------------------------------------------------
  8. function $cookies(method, name, value, ttl) {
  9.  
  10.     switch(method){
  11.         case "get":
  12.             var cookieArray = document.cookie.split("; "); 
  13.             for(var i=0; i<cookieArray.length; i++) { 
  14.                 var item = cookieArray[i].split("=");
  15.                 if(item[0] == name){
  16.                     return item[1];
  17.                 }
  18.             }
  19.             return "";
  20.             break;
  21.  
  22.         case "set":
  23.             if(!ttl) ttl = 30;
  24.             var date = new Date();
  25.             date.setTime(date.getTime() + (ttl * 24*60*60*1000));
  26.             document.cookie = name + '=' + value + '; expires=' + date.toGMTString() + '; path=/';
  27.             break;
  28.  
  29.         case "del":
  30.             document.cookie = name + '=;expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/';
  31.             break;
  32.  
  33.     }
  34.  
  35.  
  36. //----------------------------------------------------------
  37. // Show/Hide Element
  38. //----------------------------------------------------------
  39. function $toggleElement(id, method, style){
  40.     
  41.     var obj = document.getElementById(id);
  42.     if(!obj) return;
  43.  
  44.     if(!style) style = "block";
  45.  
  46.     switch(method){
  47.         case "show":
  48.             obj.style.display = style;
  49.             break;
  50.  
  51.         case "hide":
  52.             obj.style.display = "none";
  53.             break;
  54.  
  55.         default:
  56.             if(obj.style.display != "none"){
  57.                 obj.style.display = "none";
  58.             }else{
  59.                 obj.style.display = style;
  60.             }
  61.  
  62.     }
  63.  
  64. }
  65.  
  66. //----------------------------------------------------------
  67. // Shortcut for document.write and object.innerHTML
  68. //----------------------------------------------------------
  69. function $write(content, id, append){
  70.  
  71.     if(id){
  72.         var obj = document.getElementById(id);
  73.         if(obj){
  74.             if(append){
  75.                 obj.innerHTML += content;
  76.             }else{
  77.                 obj.innerHTML = content;
  78.             }
  79.             return;
  80.         }
  81.     }
  82.  
  83.     document.write(content);
  84.  
  85. }
  86.  
  87.  
  88. //----------------------------------------------------------
  89. // Write Language String
  90. //----------------------------------------------------------
  91. function $writeLang(label){
  92.   document.write($lang(label));
  93. }
  94.  
  95. //----------------------------------------------------------
  96. // Read Language String
  97. //----------------------------------------------------------
  98. function $lang(label){
  99.     
  100.     // Try load from language file
  101.     var str = external.max_Lang("StartPage", label);
  102.     if(str != "") return str;
  103.  
  104.     // Try load default data
  105.     str = maxStartPage.lang[label];
  106.     if(!str) return "?n/a?";
  107.  
  108.     return str;
  109.  
  110. }
  111.  
  112.  
  113. //----------------------------------------------------------
  114. // Clone an object/array
  115. //----------------------------------------------------------
  116. function $cloneObject(obj){
  117.     
  118.     if(typeof obj != "object") return;
  119.  
  120.     var newObj;
  121.  
  122.     if(obj instanceof Array){
  123.         // Clone Array
  124.         newObj = [];
  125.         for(var i=0; i<obj.length; i++){
  126.             if(typeof obj[i] == "object"){
  127.                 newObj[i] = $cloneObject(obj[i]);
  128.             }else{
  129.                 newObj[i] = obj[i];
  130.             }
  131.         }
  132.     }else{
  133.         // Clone Object
  134.         newObj = {};
  135.         for(i in obj){
  136.             if(typeof obj[i] == "object"){
  137.                 newObj[i] = $cloneObject(obj[i]);
  138.             }else{
  139.                 newObj[i] = obj[i];
  140.             }
  141.         }
  142.     }
  143.  
  144.     return newObj;
  145.  
  146. }
  147.  
  148.  
  149. //----------------------------------------------------------
  150. // Convert Object to JSON String
  151. //----------------------------------------------------------
  152. function $toJSONString(obj){
  153.  
  154.     switch(typeof(obj)){
  155.         case "object":
  156.             if(obj instanceof Array){
  157.                 var out = "[ \n";
  158.                 for(var i=0; i<obj.length; i++){
  159.                     var t = $toJSONString(obj[i]);
  160.                     if(t){
  161.                         out += t;
  162.                         out +=",\n";
  163.                     }
  164.                 }
  165.                 out = out.slice(0,-2);
  166.                 out += "\n]";
  167.             }else if(obj instanceof Object){
  168.                 var out = "{ \n";
  169.                 for(label in obj){
  170.                     var l = $toJSONString(label);
  171.                     var t = $toJSONString(obj[label]);
  172.                     if(t){
  173.                         out += l + ":" + t;
  174.                         out +=",\n";
  175.                     }
  176.                 }
  177.                 out = out.slice(0,-2);
  178.                 out += "\n}";
  179.             }
  180.             return out;
  181.             break;
  182.         case "string":
  183.             var str = obj.replace('\b', '\\b');
  184.             str = str.replace('\r', '\\r');
  185.             str = str.replace('\t', '\\t');
  186.             str = str.replace('\n', '\\n');
  187.             str = str.replace('\f', '\\f');
  188.             str = str.replace('\"', '\\"');
  189.             str = str.replace('\\"', '\\\\"');
  190.             return '"' + str + '"';
  191.             break;
  192.         case "number":
  193.             return isFinite(obj) ? String(obj) : 'null';
  194.             break;
  195.         case "boolean":
  196.             return String(obj);
  197.             break;
  198.         case "null":
  199.             return "null";
  200.             break;
  201.     }
  202.  
  203. }
  204.  
  205.  
  206. //**********************************************************
  207. // Create Global Namespace
  208. //**********************************************************
  209. var maxStartPage = {};
  210.  
  211. //----------------------------------------------------------
  212. // Global Variables
  213. //----------------------------------------------------------
  214. maxStartPage.global = {};
  215. maxStartPage.global.activeTab = 0;
  216. maxStartPage.global.prevTab = 0;
  217. maxStartPage.tabs = [];
  218. maxStartPage.items = [];
  219.  
  220.  
  221. //**********************************************************
  222. // Page Functions
  223. //**********************************************************
  224.  
  225. //----------------------------------------------------------
  226. // Initialize Page
  227. //----------------------------------------------------------
  228. maxStartPage.init = function(){
  229.  
  230.     // Hide all wrappers
  231.     $toggleElement("iframeWrapper", "hide");
  232.     $toggleElement("scriptWrapper", "hide");
  233.     $toggleElement("contentWrapper", "hide");
  234.     $toggleElement("searchWrapper", "hide");
  235.  
  236.     // Load Settings
  237.     maxStartPage.config.load();
  238.  
  239.     // Write basic ui elements
  240.     maxStartPage.ui.writeCssSelector();
  241.     maxStartPage.ui.writeTabs();
  242.  
  243.     // Activate default tab
  244.     maxStartPage.tab.activate(0);
  245.  
  246.     // Write Columns & Panels
  247.     maxStartPage.ui.writeColumns();
  248.     maxStartPage.ui.writePanels();
  249.  
  250.     // Attach destroy event
  251.     document.onunload = maxStartPage.destroy;
  252.  
  253. }
  254.  
  255.  
  256. //----------------------------------------------------------
  257. // Destroy Page
  258. //----------------------------------------------------------
  259. maxStartPage.destroy = function(){
  260.  
  261.     delete simpleAjax;
  262.     delete simpleFeedParser;
  263.     delete simpleMD5;
  264.     delete maxStartPage;
  265.  
  266. }
  267.  
  268.  
  269. //**********************************************************
  270. // Config Related Functions
  271. //**********************************************************
  272. maxStartPage.config = {};
  273.  
  274. //----------------------------------------------------------
  275. // Load all settings
  276. //----------------------------------------------------------
  277. maxStartPage.config.load = function(){
  278.  
  279.     maxStartPage.config.prepareTabList();
  280.     maxStartPage.config.prepareItemList();
  281.  
  282. }
  283.  
  284.  
  285. //----------------------------------------------------------
  286. // Prepare the Tab List for Start Page
  287. //----------------------------------------------------------
  288. maxStartPage.config.prepareTabList = function(){
  289.  
  290.     var strList = external.max_getPersonal('startTab');
  291.  
  292.     try{
  293.         maxStartPage.tabs = eval(strList);
  294.     }catch(e){
  295.         alert("config.prepareTabList :: can not load tab list");
  296.     }
  297.  
  298. }
  299.  
  300.  
  301. //----------------------------------------------------------
  302. // Prepare the Item List for Start Page
  303. //----------------------------------------------------------
  304. maxStartPage.config.prepareItemList = function(){
  305.  
  306.     // Add User List to Item List
  307.     var userList = maxStartPage.config.loadUserFeedList();
  308.  
  309.     if(userList){
  310.         maxStartPage.config.addToItemList(userList);
  311.     }
  312.     
  313.     // Add Server List to Item List
  314.     var serverList = external.max_getPersonal('startItem');
  315.     serverList = maxStartPage.config.parseItemList(serverList);
  316.  
  317.     if(serverList){
  318.         maxStartPage.config.addToItemList(serverList, "server");
  319.     }
  320.     
  321. }
  322.  
  323.  
  324. //----------------------------------------------------------
  325. // Parse Item List into Array
  326. //----------------------------------------------------------
  327. maxStartPage.config.parseItemList = function(strList, srcFlag){
  328.     
  329.     var itemList;
  330.     try{
  331.         itemList = eval(strList);
  332.     }catch(e){
  333.         itemList = [];
  334.     }
  335.     
  336.     if(!(itemList instanceof Array)) itemList = [];
  337.  
  338.     // Generate ID for items - need a better place
  339.     for(var i=0; i<itemList.length; i++){
  340.         itemList[i].id = maxStartPage.config.generateItemId(itemList[i]);
  341.     }
  342.  
  343.     return itemList;
  344.  
  345. }
  346.  
  347.  
  348. //----------------------------------------------------------
  349. // Add a Custom Item List to Start Page Item List
  350. //----------------------------------------------------------
  351. maxStartPage.config.addToItemList = function(customList, srcFlag){
  352.     
  353.     if(!srcFlag) srcFlag = "normal";
  354.  
  355.     // Check for duplicated item against Global Item List
  356.     for(; customList.length != 0;){
  357.  
  358.         var found = false;
  359.  
  360.         // Check through the custom list
  361.         for(var j=0; j<maxStartPage.items.length; j++){
  362.             if(customList[0].id == maxStartPage.items[j].id){
  363.  
  364.                 found = true;
  365.  
  366.                 if(srcFlag == "server"){
  367.                     maxStartPage.items[j].isServer = true;
  368.                     maxStartPage.items[j].markServer = true;
  369.                 }
  370.  
  371.             }
  372.  
  373.         }
  374.  
  375.         if(!found){
  376.  
  377.             if(srcFlag == "server"){
  378.                 customList[0].isServer = true;
  379.                 customList[0].markServer = true;
  380.             }
  381.  
  382.             // Add new item to the list
  383.             maxStartPage.items[maxStartPage.items.length] = customList[0];
  384.  
  385.         }
  386.  
  387.         customList.splice(0, 1);
  388.  
  389.     }
  390.  
  391.     // Clean up un-marked server side items
  392.     if(srcFlag == "server"){
  393.         for(var i=0; i<maxStartPage.items.length; i++){
  394.             if(maxStartPage.items[i].isServer && !maxStartPage.items[i].markServer){
  395.                 maxStartPage.items.splice(i, 1);
  396.                 i--;
  397.             }else{
  398.                 delete maxStartPage.items[i].markServer;
  399.             }
  400.         }
  401.     }
  402.  
  403. }
  404.  
  405.  
  406. //----------------------------------------------------------
  407. // Load User Feed List
  408. //----------------------------------------------------------
  409. maxStartPage.config.loadUserFeedList = function(){
  410.     
  411.     var strList = external.max_getPersonal('startFeed');
  412.  
  413.     var arrList = strList.split('$,$');
  414.     var arrResult = [];
  415.     var arrID = {};
  416.  
  417.     for(var i=0; i<arrList.length; i++){
  418.         var pos = arrList[i].indexOf('=');
  419.         if(pos>-1){
  420.  
  421.             // Generate item data
  422.             var item = {"col": 1, "type": "feed"};
  423.             item.title = arrList[i].substring(0,pos);
  424.             item.url = arrList[i].substring(pos + 1, arrList[i].length);
  425.             if(item.url.indexOf("*")==0){
  426.                 item.url = item.url.substring(1, item.url.length);
  427.                 item.isServer = true;
  428.                 item.hidden = true;
  429.             }
  430.  
  431.             item.id = maxStartPage.config.generateItemId(item);
  432.             
  433.             // Avoid duplicate item - use last one to replace
  434.             if(!arrID[item.id]){
  435.                 arrID[item.id] = arrResult.length;
  436.                 arrResult.push(item);
  437.             }else{
  438.                 arrResult[arrID[item.id]] = item;
  439.             }
  440.  
  441.         }
  442.     }
  443.  
  444.     return arrResult;
  445.  
  446. }
  447.  
  448.  
  449. //----------------------------------------------------------
  450. // Save User Feed List
  451. //----------------------------------------------------------
  452. maxStartPage.config.saveUserFeedList = function(arrItems){
  453.     
  454.     var output = "";
  455.     for(var i=0; i<arrItems.length; i++){
  456.         if(arrItems[i].type == "feed"){
  457.             if(!arrItems[i].title) arrItems[i].title = $lang("feed");
  458.             output += arrItems[i].title + "=";
  459.             if(arrItems[i].isServer && arrItems[i].hidden) output += "*";
  460.             output += arrItems[i].url + "$,$";
  461.         }
  462.     }
  463.     if(output != "") output = output.slice(0,-3);
  464.     
  465.     external.max_writePersonal('startFeed', output);
  466.  
  467. }
  468.  
  469.  
  470. //----------------------------------------------------------
  471. // Save User Item List
  472. //----------------------------------------------------------
  473. maxStartPage.config.saveUserItemList = function(){
  474.     
  475.     // Remove item id
  476.     var tempArray = $cloneObject(maxStartPage.items);
  477.     for(var i=0; i<maxStartPage.items.length; i++){
  478.         delete tempArray[i].id;
  479.     }
  480.  
  481.     // Save the Feed List
  482.     maxStartPage.config.saveUserFeedList(tempArray);
  483.  
  484. }
  485.  
  486.  
  487. //----------------------------------------------------------
  488. // Generate Unique Id for Items
  489. //----------------------------------------------------------
  490. maxStartPage.config.generateItemId = function(item){
  491.  
  492.     switch(item.type){
  493.         case "feed":
  494.             return "feed_" + simpleMD5.hex_md5(item.url);
  495.             break;
  496.         case "html":
  497.             return "html_" + simpleMD5.hex_md5(item.url);
  498.             break;
  499.         default:
  500.             return item.type + "_" + item.value;
  501.             break;
  502.     }
  503.  
  504. }
  505.  
  506.  
  507. //----------------------------------------------------------
  508. // Get Item by ID
  509. //----------------------------------------------------------
  510. maxStartPage.config.getItemById = function(id) {
  511.  
  512.     for(var i=0; i<maxStartPage.items.length; i++){
  513.         if(maxStartPage.items[i].id == id){
  514.             return maxStartPage.items[i];
  515.         }
  516.     }
  517.  
  518.     return null;
  519.  
  520. }
  521.  
  522.  
  523. //----------------------------------------------------------
  524. // Update Item by ID
  525. //----------------------------------------------------------
  526. maxStartPage.config.updateItem = function(item) {
  527.     
  528.     if(!item.id) return;
  529.  
  530.     for(var i=0; i<maxStartPage.items.length; i++){
  531.         if(maxStartPage.items[i].id == item.id){
  532.             maxStartPage.items[i] = item;
  533.         }
  534.     }
  535.  
  536. }
  537.  
  538.  
  539. //----------------------------------------------------------
  540. // Remove Item by ID
  541. //----------------------------------------------------------
  542. maxStartPage.config.removeItemById = function(id) {
  543.     
  544.     for(var i=0; i<maxStartPage.items.length; i++){
  545.  
  546.         if(maxStartPage.items[i].id == id){
  547.  
  548.             if(maxStartPage.items[i].isServer){
  549.                 // Just hide for server items
  550.                 maxStartPage.items[i].hidden = true;
  551.             }else{
  552.                 // Remove item from list
  553.                 maxStartPage.items.splice(i, 1);
  554.             }
  555.  
  556.         }
  557.  
  558.     }
  559.  
  560. }
  561.  
  562.  
  563.  
  564.  
  565.  
  566. //----------------------------------------------------------
  567. // Remove Items in a Custom List From Start Page Item List
  568. //----------------------------------------------------------
  569. maxStartPage.config.removeFromItemList = function(customList){
  570. }
  571.  
  572.  
  573. //**********************************************************
  574. // UI Related Functions
  575. //**********************************************************
  576. maxStartPage.ui = {};
  577.  
  578. //----------------------------------------------------------
  579. // Output CSS <link> tag
  580. //----------------------------------------------------------
  581. maxStartPage.ui.attachCss = function(){
  582.  
  583.   for(var i=0;i<maxStartPage.cssFiles.length;i++){
  584.     $write('<link title="css'+i+'" href="'+maxStartPage.cssFiles[i][1]+'" rel="stylesheet" disabled="true" type="text/css" />');
  585.   }
  586.  
  587. }
  588.  
  589.  
  590. //----------------------------------------------------------
  591. // Output CSS Selector
  592. //----------------------------------------------------------
  593. maxStartPage.ui.writeCssSelector = function(){
  594.     var output = "";
  595.   for(var i=0;i<maxStartPage.cssFiles.length;i++){
  596.     if(i>0) output += ' | ';
  597.     output += '<a href="javascript:void(0)" onclick="maxStartPage.ui.applyStyleSheet(\'css'+i+'\')">' +
  598.                             maxStartPage.cssFiles[i][0] +
  599.                             '</a>';
  600.   }
  601.     $write(output, "cssSelector");
  602. }
  603.  
  604.  
  605. //----------------------------------------------------------
  606. // Apply Selected CSS
  607. //----------------------------------------------------------
  608. maxStartPage.ui.applyStyleSheet = function(strCSS){
  609.   var objs=document.getElementsByTagName("link");
  610.   var intFound=0;
  611.   for(var i=0;i<objs.length;i++){
  612.     if(objs[i].type.indexOf("css")>-1&&objs[i].title){
  613.       objs[i].disabled = true;
  614.       if(objs[i].title==strCSS) intFound=i;
  615.     }
  616.   }
  617.   objs[intFound].disabled = false;
  618.   $cookies("set", "stylesheet", objs[intFound].title);
  619. }
  620.  
  621.  
  622. //----------------------------------------------------------
  623. // Output Tabs
  624. //----------------------------------------------------------
  625. maxStartPage.ui.writeTabs = function(){
  626.  
  627.   var obj = document.getElementById("navtabs");
  628.   for(var i=0;i<maxStartPage.tabs.length;i++){
  629.     obj.innerHTML += '<li>'+
  630.             '<a href="javascript:void(0)" onclick="maxStartPage.tab.activate('+i+');this.blur()">' +
  631.             maxStartPage.tabs[i].title +
  632.             '</a>'+
  633.             '</li>\n';
  634.   }
  635.  
  636. }
  637.  
  638.  
  639. //----------------------------------------------------------
  640. // Generate Columns
  641. //----------------------------------------------------------
  642. maxStartPage.ui.writeColumns = function(){
  643.     
  644.     var output = '<table width="100%" border="0" cellpadding="0" cellspacing="10">'+
  645.                             '<tr>';
  646.     var width = 'width="' + Math.round(100 / maxStartPage.global.columnCount) + '%"';
  647.  
  648.     for(var i=0;i<maxStartPage.global.columnCount;i++){
  649.         output += '<td valign="top" class="column" '+ (i != (maxStartPage.global.columnCount-1) ? width : '')+'><div id="column_'+i+'"></div></td>';
  650.     }
  651.     
  652.     output += '</tr>'+
  653.                         '</table>';
  654.     
  655.     $write(output, "contentWrapper");
  656.  
  657. }
  658.  
  659.  
  660. //----------------------------------------------------------
  661. // Write and initialize panels
  662. //----------------------------------------------------------
  663. maxStartPage.ui.writePanels = function(){
  664.     
  665.     for(var i=0; i<maxStartPage.items.length;i++){
  666.         
  667.         maxStartPage.panel.add(maxStartPage.items[i]);
  668.         maxStartPage.panel.init(maxStartPage.items[i]);
  669.  
  670.     }
  671.  
  672. }
  673.  
  674.  
  675. //**********************************************************
  676. // Tab Related Functions
  677. //**********************************************************
  678. maxStartPage.tab = {};
  679.  
  680. //----------------------------------------------------------
  681. // Switch Tab
  682. //----------------------------------------------------------
  683. maxStartPage.tab.activate = function(tabNum){
  684.     
  685.     // Avoid duplicate activation of tab
  686.     if(tabNum == maxStartPage.global.activeTab && maxStartPage.global.activeTab != 0) return;
  687.  
  688.     // Switch tab UI
  689.     var obj = document.getElementById("navtabs");
  690.     var objs = obj.getElementsByTagName("A");
  691.     for(var i=0;i<objs.length;i++){
  692.         objs[i].className="";
  693.     if(i==tabNum) objs[i].className="active";
  694.     }
  695.  
  696.     maxStartPage.global.prevTab = maxStartPage.global.activeTab;
  697.     maxStartPage.global.activeTab = tabNum;
  698.     
  699.     if(!maxStartPage.tabs[maxStartPage.global.activeTab].type){
  700.         maxStartPage.tabs[maxStartPage.global.activeTab].type = "unknown";
  701.     }
  702.  
  703.     // Do hide stuff
  704.     switch(maxStartPage.tabs[maxStartPage.global.prevTab].type){
  705.         case "iframe":
  706.             maxStartPage.tab.hideIFrame();
  707.             break;
  708.         case "script":
  709.             maxStartPage.tab.hideScript();
  710.             break;
  711.         default:
  712.             maxStartPage.tab.hideMain();
  713.     }
  714.     
  715.     // Do show stuff
  716.     switch(maxStartPage.tabs[maxStartPage.global.activeTab].type){
  717.         case "iframe":
  718.             maxStartPage.tab.showIFrame();
  719.             break;
  720.         case "script":
  721.             maxStartPage.tab.showScript();
  722.             break;
  723.         default:
  724.             maxStartPage.tab.showMain();
  725.     }
  726.  
  727. }
  728.  
  729.  
  730. //----------------------------------------------------------
  731. // Show Main Content Tab
  732. //----------------------------------------------------------
  733. maxStartPage.tab.showMain = function(){
  734.  
  735.         $toggleElement("contentWrapper", "show");
  736.         $toggleElement("searchWrapper", "show");
  737.  
  738.  
  739.         var output = "";
  740.         if(maxStartPage.tabs[maxStartPage.global.activeTab].label){
  741.             output = maxStartPage.tabs[maxStartPage.global.activeTab].label;
  742.         }else{
  743.             output = maxStartPage.tabs[maxStartPage.global.activeTab].title;
  744.         }
  745.         
  746.         output += ' ' +
  747.                             '    <input type="text" id="searchQuery" value="" class="text" />' +
  748.                             '    <input id="searchButton" type="button" name="btn" onclick="maxStartPage.search.execute();" value=" '+$lang("search")+' " class="button" />';
  749.  
  750.         $write(output, "searchWrapper");
  751.  
  752.         document.getElementById("searchQuery").focus();
  753.  
  754. }
  755.  
  756.  
  757. //----------------------------------------------------------
  758. // Hide Main Content Tab
  759. //----------------------------------------------------------
  760. maxStartPage.tab.hideMain = function(){
  761.  
  762.     $toggleElement("contentWrapper", "hide");
  763.     $toggleElement("searchWrapper", "hide");
  764.  
  765. }
  766.  
  767.  
  768. //----------------------------------------------------------
  769. // Show IFrame Tab
  770. //----------------------------------------------------------
  771. maxStartPage.tab.showIFrame = function(){
  772.  
  773.         $toggleElement("iframeWrapper", "show");
  774.         
  775.         var size = maxStartPage.tabs[maxStartPage.global.activeTab].size.split("*");
  776.  
  777.         var obj = document.getElementById("theIFrame");
  778.         if(obj){
  779.             obj.style.width = size[0];
  780.             obj.style.height = size[1];
  781.             obj.src = maxStartPage.tabs[maxStartPage.global.activeTab].url;
  782.         }
  783.  
  784. }
  785.  
  786.  
  787. //----------------------------------------------------------
  788. // Hide IFrame Tab
  789. //----------------------------------------------------------
  790. maxStartPage.tab.hideIFrame = function(){
  791.  
  792.     $toggleElement("iframeWrapper", "hide");
  793.  
  794. }
  795.  
  796.  
  797. //----------------------------------------------------------
  798. // Switch To Script Tab
  799. //----------------------------------------------------------
  800. maxStartPage.tab.showScript = function(){
  801.  
  802.     $toggleElement("scriptWrapper", "show");
  803.  
  804.     // If already exists
  805.     obj = document.getElementById("scriptWrapper_"+maxStartPage.tabs[maxStartPage.global.activeTab].namespace);
  806.     if(obj){
  807.         obj.style.display = "block";
  808.         try{
  809.             eval(maxStartPage.tabs[maxStartPage.global.activeTab].namespace+".show()");
  810.         }catch(e){}
  811.         return;
  812.     }
  813.     
  814.     // Append New
  815.     obj = document.getElementById("scriptWrapper");
  816.     obj.innerHTML += '<div id="scriptWrapper_'+maxStartPage.tabs[maxStartPage.global.activeTab].namespace+'">'+
  817.                                      '<div class="script-comment">'+$lang("loading")+'</div>'+
  818.                                      '</div>';
  819.  
  820.     // Load the Script
  821.     maxStartPage.script.load(maxStartPage.tabs[maxStartPage.global.activeTab].namespace,
  822.                                                     maxStartPage.tabs[maxStartPage.global.activeTab].url,
  823.                                                     maxStartPage.script.onLoad
  824.                                                     );
  825.  
  826. }
  827.  
  828.  
  829. //----------------------------------------------------------
  830. // Hide Script Tab
  831. //----------------------------------------------------------
  832. maxStartPage.tab.hideScript = function(){
  833.  
  834.     $toggleElement("scriptWrapper", "hide");
  835.  
  836.     try{
  837.         $toggleElement("scriptWrapper_"+maxStartPage.tabs[maxStartPage.global.prevTab].namespace, "hide");
  838.         eval(maxStartPage.tabs[maxStartPage.global.prevTab].namespace+".hide()");
  839.     }catch(e){}
  840.  
  841. }
  842.  
  843.  
  844. //**********************************************************
  845. // Panel Related Functions
  846. //**********************************************************
  847. maxStartPage.panel = {};
  848.  
  849.  
  850. //----------------------------------------------------------
  851. // Add Panel to Columns
  852. //----------------------------------------------------------
  853. maxStartPage.panel.add = function(item){
  854.     
  855.     if(item.hidden) return; // To hide server-side items
  856.  
  857.     if(!item.col) item.col = 0;
  858.     if(item.col > maxStartPage.global.columnCount) item.col = maxStartPage.global.columnCount;
  859.  
  860.     var output = '<div class="panel" id="panel_'+item.id+'">\n'+
  861.                             '<h5 id="panelHnd_'+item.id+'">'+
  862.                                 '<div class="panel-control" id="panelCtrl_'+item.id+'"></div>'+
  863.                                 '<a href="javascript:void(0)" onclick="$toggleElement(\'panelBox_'+item.id+'\');this.blur()" id="panelTtl_'+item.id+'">[Panel]</a>'+
  864.                             '</h5>\n'+
  865.                             '<div id="panelBox_'+item.id+'">'+
  866.                             '<div class="panel-content" id="panelCnt_'+item.id+'"></div>\n'+
  867.                             '</div>'+
  868.                             '</div>\n';
  869.     
  870.     $write(output, "column_"+item.col, true);
  871.  
  872. }
  873.  
  874.  
  875. //----------------------------------------------------------
  876. // Remove Panel
  877. //----------------------------------------------------------
  878. maxStartPage.panel.close = function(id){
  879.  
  880.     // Update Item List before clsoe
  881.     maxStartPage.config.removeItemById(id);
  882.     
  883.     // Save the list
  884.     maxStartPage.config.saveUserItemList();
  885.  
  886.     // Update UI
  887.     var obj = maxStartPage.panel.getPanelById(id);
  888.     if(obj){
  889.         obj.removeNode(true);
  890.     }
  891.  
  892. }
  893.  
  894.  
  895. //----------------------------------------------------------
  896. // Get Panel By Id
  897. //----------------------------------------------------------
  898. maxStartPage.panel.getPanelById = function(id){
  899.  
  900.     var obj = document.getElementById("panel_"+id);
  901.     if(obj){
  902.         return obj;
  903.     }else{
  904.         return null;
  905.     }
  906.  
  907. }
  908.  
  909.  
  910. //----------------------------------------------------------
  911. // Initialize Panel Content
  912. //----------------------------------------------------------
  913. maxStartPage.panel.init = function(item){
  914.  
  915.     if(item.hidden) return; // To hide server-side items
  916.  
  917.     switch(item.type){
  918.         case "internal":
  919.             switch(item.value){
  920.                 case "hotfav":
  921.                     maxStartPage.panel.write(item.id, $lang("hotfav"), "title");
  922.                     maxStartPage.panel.write(item.id, maxStartPage.hotFav.generateHTML());
  923.                     break;
  924.                 default:
  925.                     alert("panel.init :: unknown internal panel type");
  926.             }
  927.             break;
  928.         case "html":
  929.             if(!item.title) item.title = $lang("html_content");
  930.             maxStartPage.panel.write(item.id, item.title, "title");
  931.             maxStartPage.html.load(item.id, item.url);
  932.             break;
  933.         case "feed":
  934.             if(!item.title) item.title = $lang("feed");
  935.             var strControl = '<a href="javascript:void(0)" onclick="maxStartPage.feed.load(\''+item.id+'\')"><img src="images/refresh.gif"/></a>'+
  936.                 ' '+
  937.                 '<a href="javascript:void(0)" onclick="maxStartPage.panel.close(\''+item.id+'\')"><img src="images/close.gif"/></a>';
  938.             maxStartPage.panel.write(item.id, strControl, "control");
  939.             maxStartPage.panel.write(item.id, item.title, "title");
  940.             maxStartPage.feed.load(item.id, item.url);
  941.             break;
  942.         default:
  943.             alert("panel.init :: unknown item type");
  944.     }
  945.  
  946. }
  947.  
  948.  
  949. //----------------------------------------------------------
  950. // Write Content to Panel
  951. //----------------------------------------------------------
  952. maxStartPage.panel.write = function(id, content, part, append){
  953.  
  954.     switch(part){
  955.         case "title":
  956.             $write(content, "panelTtl_"+id, append);
  957.             break;
  958.         case "control":
  959.             $write(content, "panelCtrl_"+id, append);
  960.             break;
  961.         default:
  962.             $write(content, "panelCnt_"+id, append);
  963.     }
  964.  
  965. }
  966.  
  967.  
  968. //**********************************************************
  969. // Search Related Functions
  970. //**********************************************************
  971. maxStartPage.search = {};
  972.  
  973. //----------------------------------------------------------
  974. // Search Form Submision
  975. //----------------------------------------------------------
  976. maxStartPage.search.execute = function(){
  977.  
  978.     var tip = $lang("askforkeyword");
  979.     var obj = document.getElementById("searchQuery");
  980.  
  981.     if(obj.value != "" && obj.value != tip){
  982.  
  983.         window.open(
  984.             maxStartPage.tabs[maxStartPage.global.activeTab].url.replace("%s", encodeURI(obj.value))
  985.         );
  986.         
  987.     }else{
  988.  
  989.         obj.value = tip;
  990.         obj.focus();
  991.         obj.select();
  992.         
  993.     }
  994.  
  995. }
  996.  
  997.  
  998. //**********************************************************
  999. // HTML Panel Functions
  1000. //**********************************************************
  1001. maxStartPage.html = {};
  1002.  
  1003. //----------------------------------------------------------
  1004. // Load HTML
  1005. //----------------------------------------------------------
  1006. maxStartPage.html.load = function(id, url){
  1007.  
  1008.   maxStartPage.panel.write(id, '<span class="comment">'+$lang("loading")+'</span>');
  1009.   
  1010.     if(!simpleAjax.get(id, url, maxStartPage.html.output, {"responseType": 0})){
  1011.         maxStartPage.panel.write(id, '<span class="comment">'+$lang("load_error")+'('+simpleAjax.error.description+')</span>');
  1012.   }
  1013.  
  1014. }
  1015.  
  1016.  
  1017. //----------------------------------------------------------
  1018. // Output HTML
  1019. //----------------------------------------------------------
  1020. maxStartPage.html.output = function(id, result, status, statusText){
  1021.  
  1022.   if(result){
  1023.         maxStartPage.panel.write(id, simpleAjax.result[id]);
  1024.   }else{
  1025.         maxStartPage.panel.write(id, '<span class="comment">'+$lang("load_error")+'('+status+':'+statusText+')</span>');
  1026.   }
  1027.  
  1028. }
  1029.  
  1030.  
  1031. //**********************************************************
  1032. // External Script Related Functions
  1033. //**********************************************************
  1034. maxStartPage.script = {};
  1035.  
  1036. //----------------------------------------------------------
  1037. // Load Script File - require simpleAjax
  1038. //----------------------------------------------------------
  1039. maxStartPage.script.load = function(id, url, callBackFunc){
  1040.     if(!simpleAjax.get(id, url, callBackFunc, {"responseType": 0})){
  1041.         $write('<div class="script-comment">'+$lang("load_script_error")+' ('+simpleAjax.error.number+':'+simpleAjax.error.description+')</div>', "scriptWrapper_");
  1042.     }
  1043. }
  1044.  
  1045. //----------------------------------------------------------
  1046. // When Script File is Loaded
  1047. //----------------------------------------------------------
  1048. maxStartPage.script.onLoad = function(id, result, status, statusText){
  1049.   if(result){
  1050.     eval(simpleAjax.result[id]);
  1051.   }else{
  1052.         $write('<div class="script-comment">'+$lang("load_script_error")+' ('+status+':'+statusText+')</div>', "scriptWrapper_"+id);
  1053.   }
  1054. }
  1055.  
  1056.  
  1057. //**********************************************************
  1058. // Feed Functions
  1059. //**********************************************************
  1060. maxStartPage.feed = {};
  1061.  
  1062.  
  1063. //----------------------------------------------------------
  1064. // Load Feed
  1065. //----------------------------------------------------------
  1066. maxStartPage.feed.load = function(id, url){
  1067.     
  1068.     // Check if URL presents
  1069.     if(!url){
  1070.         var item = maxStartPage.config.getItemById(id);
  1071.         if(item){
  1072.             url = item.url;
  1073.         }else{
  1074.             return;
  1075.         }
  1076.     }
  1077.  
  1078.     maxStartPage.panel.write(id, '<span class="comment">'+$lang("loading")+'</span>');
  1079.  
  1080.     if(!simpleAjax.load(id, url, maxStartPage.feed.output, 0)){
  1081.         maxStartPage.panel.write(id, '<span class="comment">'+$lang("load_error")+'('+simpleAjax.error.number+':'+simpleAjax.error.description+')</span>');
  1082.     }
  1083.  
  1084. }
  1085.  
  1086.  
  1087. //----------------------------------------------------------
  1088. // Output Feed content into panel
  1089. //----------------------------------------------------------
  1090. maxStartPage.feed.output= function(id, result, errorCode, errorText){
  1091.  
  1092.     // Check if target panel exists
  1093.     var obj = maxStartPage.panel.getPanelById(id);
  1094.     if(!obj) return;
  1095.  
  1096.     if(result){
  1097.     maxStartPage.feed.parse(id, simpleAjax.result[id]);
  1098.   }else{
  1099.         maxStartPage.panel.write(id, '<span class="comment">'+$lang("load_error")+'('+errorCode+':'+errorText+')</span>');
  1100.   }
  1101.  
  1102. }
  1103.  
  1104.  
  1105. //----------------------------------------------------------
  1106. // Parse Feed Data into HTML
  1107. //----------------------------------------------------------
  1108. maxStartPage.feed.parse = function(id, feedSource){
  1109.     
  1110.     // Parse feed
  1111.     var objFeed = simpleFeedParser.parse(feedSource);
  1112.  
  1113.     // Process result
  1114.     if(typeof(objFeed)=="string"){
  1115.         
  1116.         // We got parse error
  1117.     maxStartPage.panel.write(id, '<span class="comment">'+$lang("parse_error")+'('+objFeed+')</span>');
  1118.  
  1119.   }else{
  1120.  
  1121.         // Prepare output content
  1122.     var outputHTML="";
  1123.  
  1124.     if(objFeed.items.length>0){
  1125.       for(var i=0;i<objFeed.items.length;i++){
  1126.         outputHTML+='<li><a href="javascript:void(0)" onclick="maxStartPage.feed.ui.toggleItem(this);this.blur()">'+objFeed.items[i].title+'</a>'+
  1127.           '  <a href="'+objFeed.items[i].link+'" target="_blank" class="feed-more">»</a>\n'+
  1128.           '<div class="feed-content" style="display:none">\n'+objFeed.items[i].description+'\n</div></li>\n';
  1129.       }
  1130.     }else{
  1131.       outputHTML='<li>'+$lang("no_content")+'</li>';
  1132.     }
  1133.  
  1134.     outputHTML='<div class="feed-box">\n<ul>\n'+outputHTML+'</ul>\n</div>\n';
  1135.  
  1136.     // Output now
  1137.         maxStartPage.panel.write(id, objFeed.title, 'title');
  1138.     maxStartPage.panel.write(id, outputHTML);
  1139.  
  1140.   }
  1141.  
  1142. }
  1143.  
  1144. //----------------------------------------------------------
  1145. // Feed UI Functions
  1146. //----------------------------------------------------------
  1147. maxStartPage.feed.ui = {};
  1148.  
  1149. //----------------------------------------------------------
  1150. // toggle show/hide a single feed content 
  1151. //----------------------------------------------------------
  1152. maxStartPage.feed.ui.toggleItem = function(objA){
  1153.  
  1154.   var obj=objA.parentElement;
  1155.   var objs=obj.getElementsByTagName("DIV");
  1156.     for(var i=0;i<objs.length;i++){
  1157.     if(objs[i].className=="feed-content"){
  1158.       if(objs[i].style.display!="none"){
  1159.         objs[i].style.display="none";
  1160.       }else{
  1161.         objs[i].style.display="block";
  1162.       }
  1163.     }
  1164.     }
  1165.  
  1166. }
  1167.  
  1168.  
  1169. //----------------------------------------------------------
  1170. // Hot Favorites List Related Functions
  1171. //----------------------------------------------------------
  1172. maxStartPage.hotFav ={};
  1173.  
  1174.  
  1175. //----------------------------------------------------------
  1176. // Load the Hot Favorites List
  1177. //----------------------------------------------------------
  1178. maxStartPage.hotFav.load = function(){
  1179.  
  1180.     var strList = external.max_getPersonal('hotfav');
  1181.  
  1182.     var arrList = strList.split('$,$');
  1183.     var arrResult = [];
  1184.  
  1185.     for(var i=0; i<arrList.length; i++){
  1186.         var pos = arrList[i].indexOf('=');
  1187.         if(pos>-1){
  1188.             var name = arrList[i].substring(0,pos);
  1189.             var url = arrList[i].substring(pos + 1, arrList[i].length);
  1190.             arrResult.push([name, url]);
  1191.         }
  1192.     }
  1193.     
  1194.     return arrResult;
  1195.  
  1196. }
  1197.  
  1198.  
  1199. //----------------------------------------------------------
  1200. // Genreate HTML for Hot Favorites List
  1201. //----------------------------------------------------------
  1202. maxStartPage.hotFav.generateHTML = function(){
  1203.  
  1204.     var arrList = maxStartPage.hotFav.load();
  1205.     var output = "";
  1206.  
  1207.     output += "<ul>";
  1208.     for(var i=0; i<arrList.length; i++){
  1209.         output += '<li><a href="'+arrList[i][1]+'" target="_blank">'+arrList[i][0]+'</a>';
  1210.     }
  1211.     output += "</ul>";
  1212.     
  1213.     return output;
  1214.  
  1215. }